package wawi.actions;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DecimalFormat;

import wawi.db.DbConnector;
import wawi.kasse.KasseController;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;

public class RechnungPDF
{
	private final static float CM = 28.346f;
	
	private Verkauf verkauf;
	
	//Enviroment
	private Document document;
	private PdfWriter writer;
	private PdfContentByte cb;
	
	
	//Font
	private BaseFont bf;	
	private BaseFont bf_bold;
	
	
	
	
	public RechnungPDF (Verkauf verkauf) throws DocumentException, IOException
	{
		this.verkauf = verkauf;
		
		bf = BaseFont.createFont(
				BaseFont.HELVETICA,
				BaseFont.CP1252,
				BaseFont.NOT_EMBEDDED);
		
		bf_bold = BaseFont.createFont(
				BaseFont.HELVETICA_BOLD,
				BaseFont.CP1252,
				BaseFont.NOT_EMBEDDED);
		
		
	}
	
	private void openPDF(OutputStream out) throws DocumentException
	{
		document = new Document(PageSize.A5);
		writer = PdfWriter.getInstance(document, out);
		document.open();
		cb = writer.getDirectContent();
	}
	
	private void close()
	{
		document.close();
	}
	
	private void generateContent() throws DocumentException
	{		
		DecimalFormat df = new DecimalFormat("0.00");	
		
		cb.setFontAndSize(bf_bold, 8);		
		
		writeTextAt(10.3f*CM, 18.35f*CM, verkauf.getRgNum());
		writeTextAt(10.3f*CM, 17.65f*CM, verkauf.getRgDatum());
		
		float pos_Y = 16.0f;
		
		//Positionen
		cb.setFontAndSize(bf, 8);	
		for (VerkaufPosition tmp : verkauf.getPositionen())
		{			
			//Menge
			writeTextAt(2.2f*CM, pos_Y*CM, tmp.getMenge()+"");
			
			//Artikel
			writeTextAt(3.5f*CM, pos_Y*CM, tmp.getArtikelDetails().getArtikel().getTextKurz() + " [" + tmp.getArtikelDetails().getArtNr() + "]");
			writeTextAt(3.5f*CM, (pos_Y-0.4f)*CM, tmp.getArtikelDetails().getFarbe() + ", " + tmp.getArtikelDetails().getGroesse());
			
			//Preis
			if (tmp.getStatus() == VerkaufPosition.STATUS_OK)
			{
				writeTextAt(9.7f*CM, pos_Y*CM, df.format(tmp.getPreisvk()));
				writeTextAt(11.1f*CM, pos_Y*CM, df.format(tmp.getGesamtPreis()));
			}
			else
			{
				//Durchstreichen
				cb.saveState();
				cb.rectangle(3.5f*CM, (pos_Y+0.1f)*CM, 6.0f*CM, 0.02f*CM);
				cb.rectangle(3.5f*CM, (pos_Y-0.3f)*CM, 6.0f*CM, 0.02f*CM);
		        cb.stroke();
		        cb.restoreState();
			}
			
			pos_Y = pos_Y - 1.25f;
		}
			
		
		//Hinweis-Text
		String hinweis = verkauf.getHinweis();		
		boolean row2 = false;
		if (hinweis.length()>70)
		{
			hinweis = hinweis.substring(0, 70);
			row2 = true;
		}		
		cb.setFontAndSize(bf, 8);
		writeTextAt(3.5f*CM, 8.5f*CM, hinweis);
		
		if (row2)
		{
			hinweis = verkauf.getHinweis().substring(70);
			
			if (hinweis.length()>70)
				hinweis = hinweis.substring(0, 70);
			
			cb.setFontAndSize(bf, 8);
			writeTextAt(3.5f*CM, 8.1f*CM, hinweis);
		}
		
		
		//Zahlart
		if (verkauf.getVerrechnungen().size()==0)
		{
			//keine Gutschriften verrechnet
			cb.setFontAndSize(bf, 8);	
			writeTextAt(3.5f*CM, 7.4f*CM, verkauf.getZahlartStr());
		}
		else if (verkauf.getVerrechnungen().size()>0 && (verkauf.getPreis()-verkauf.getSummeGutschriften())<=0)
		{
			//nur mit Gutschrift bezahlt
			cb.setFontAndSize(bf, 8);	
			writeTextAt(3.5f*CM, 7.4f*CM, "Gutschriften (" + verkauf.getSummeGutschriften() + "EUR )");
		}
		else
		{
			//Gutschriften verrechnet
			cb.setFontAndSize(bf, 8);
			String str = String.format("Gutschriften (%s EUR), %s (%s EUR)",
					df.format(verkauf.getSummeGutschriften()), //Gutschriften
					verkauf.getZahlartStr(), //Zahlart
					df.format(verkauf.getPreis()-verkauf.getSummeGutschriften())); //Differenz: Warenwert-Guschrif

			writeTextAt(3.5f*CM, 7.4f*CM, str);
		}
		
		//MwSt.
		cb.setFontAndSize(bf, 8);	
		writeTextAt(6.2f*CM, 6.6f*CM, df.format(verkauf.getMwSt()));
		
		//Endbetrag
		cb.setFontAndSize(bf_bold, 8);	
		writeTextAt(11.1f*CM, 6.6f*CM, df.format(verkauf.getPreis()));
		
	}
	
	private void writeTextAt (float x, float y, String text)
	{
		cb.beginText();
		cb.setTextMatrix(x, y);
		cb.showText(text);
		cb.endText();
	}
	
	public void writeToFile (File file) throws FileNotFoundException, IOException, DocumentException
	{
		FileOutputStream fos = new FileOutputStream(file);
		openPDF(fos);		
		
		generateContent();
		close();
		
		fos.flush();
		fos.close();
	}
	
	public static void main(String[] args) throws Exception
	{
		int recid = 167;
		Verkauf tmp = DbConnector.getInstance().readVerkauf(recid);
		
		new RechnungPDF(tmp).writeToFile(new File("D:\\test_rg.pdf"));
		
		DbConnector.getInstance().disconnect();
	}
}
